package main

import "fmt"

/**

给定一个排序数组和一个目标值，在数组中找到目标值，并返回其索引。如果目标值不存在于数组中，返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。


示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2
示例2:

输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

*/

// 使用最笨的方法进行循环遍历
func searchInsert(nums []int, insertNum int) int {

	for i := 0; i < len(nums); i++ {
		if nums[i] >= insertNum {
			return i
		}
	}
	return len(nums)

}

// 使用二分算法进行处理
func searchInsert2(nums []int, insertNum int) int {

	//left:=0
	//right:=len(nums)-1
	//for left <= right {
	//	mid:= ((right-left)>>1)+left
	//	if(nums[mid]<=insertNum){
	//		left=mid+1
	//	}else {
	//		right=mid-1
	//	}
	//}
	//return left

	n := len(nums)
	left, right := 0, n-1
	ans := n
	for left <= right {
		mid := (right-left)>>1 + left
		if insertNum <= nums[mid] {
			ans = mid
			right = mid - 1
		} else {
			left = mid + 1
		}
	}
	return ans

}

func main() {
	nums := []int{1, 3, 5, 6}
	//fmt.Println(searchInsert(nums,7))
	fmt.Println(searchInsert2(nums, 5))
}
